package generic;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @description:
 * @Author yyp
 * @time 2022/3/28
 */
public class GenericExtends {
    public static void main(String[] args) {
        Object o = new String("test");

        //error: require type Object provided String
        //List<Object> list = new ArrayList<String>();

        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<A> list3 = new ArrayList<>();
        List<B> list4 = new ArrayList<>();
        List<C> list5 = new ArrayList<>();

        //如果是 List<?> c ，可以接受任意的泛型类型
        printCollecting1(list1);
        printCollecting1(list2);
        printCollecting1(list3);
        printCollecting1(list4);
        printCollecting1(list5);

        //List<? extends AA> c： 表示 上限，可以接受 AA 或者 AA 子类
//        printCollecting2(list1);
//        printCollecting2(list2);
        printCollecting2(list3);
        printCollecting2(list4);
        printCollecting2(list5);

        //List<? super AA> c: 支持 AA 类以及 AA 类的父类，不限于直接父类
//        printCollecting2(list1);
//        printCollecting2(list2);
        printCollecting2(list3);
        printCollecting2(list4);
        printCollecting2(list5);


    }
    @Test
    static void printCollecting1(List<?> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }

    static void printCollecting2(List<? extends A> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }

    static void printCollecting3(List<? super A> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }
}

class A{

}
class B extends A{

}
class C extends B{

}
